

import java.util.HashMap;


import data.Arrete;

import data.Sommet;
import data.SommetComparator;

import java.lang.Math;

public class Graphe implements GrapheConf {

	public HashMap<Integer, HashMap<Integer,Integer>> distances;
	
	public SommetComparator<Arrete> comparator;
	
	public Graphe(){
		distances = new HashMap<Integer, HashMap<Integer,Integer>>();
		
		for (int i=0; i<16;i=i+1){
			HashMap<Integer,Integer> temp=new HashMap<Integer,Integer>();
			for (int j=0;j<16;j=j+1){
				int x=Math.abs(i%4-j%4);
				int y = Math.abs(i/4-j/4);
				temp.put(j,x+y);
				
			}
			distances.put(i,temp);
		}
		comparator=new SommetComparator<Arrete>();
	}
	
	

	@Override
	public Integer estimationDistance(Sommet s) {
		int distance=0;
		for (int i=0;i<16;i=i+1){
			if (!(s.sommet[i]==0)){
			
			distance=distance+distances.get(i).get(s.sommet[i]);
			}
		}
		return distance;
	}
	
	public Sommet initialiseSommet(String[] t){
		//Ici, on suppose que le tableau t a bien 16 cases
		Sommet s=new Sommet();
		for (int i=0; i<16; i=i+1){
			int j = Integer.parseInt(t[i]);
			s.sommet[i]=j;
			if (j==0){
				s.zero=i;
			}
		}
		s.estimation=estimationDistance(s);
		return s;
	}
	
	public void gauche(Sommet s){
		int i=s.sommet[s.zero-1];
		s.sommet[s.zero]=i;
		s.sommet[s.zero-1]=0;
		s.zero=s.zero-1;
		s.estimation=estimationDistance(s);
	}
	public void droite(Sommet s){
		int i=s.sommet[s.zero+1];
		s.sommet[s.zero]=i;
		s.sommet[s.zero+1]=0;
		s.zero=s.zero+1;
		s.estimation=estimationDistance(s);
	}
	public void bas(Sommet s){
		int i=s.sommet[s.zero+4];
		s.sommet[s.zero]=i;
		s.sommet[s.zero+4]=0;
		s.zero=s.zero+4;
		s.estimation=estimationDistance(s);
	}
	public void haut(Sommet s){
		int i=s.sommet[s.zero-4];
		s.sommet[s.zero]=i;
		s.sommet[s.zero-4]=0;
		s.zero=s.zero-4;
		s.estimation=estimationDistance(s);
	}
}
